<?php
	/**
	 * Znajduje i zwraca pozycje poczatku URL-a w podanym ciagu.
	 *
	 * @param str $str
	 * @param int $offset
	 * @return int
	 */
	function find_start_of_url($str, $offset = 0){
		// okreslamy protokoly, www dla linkow bez protokolow
		$prot = array('http://','ftp://','https://','www.');
		$positions = array();
		// przeszukujemy ciag w poszukiwaniu protokolu
		foreach ($prot as $p) {
			$ok = true;

			$pos = strpos($str, $p, $offset);
			if($pos !== false){
				// sprawdzamy, czy nie jest juz hyperlinkiem
				if(substr($str, $pos-1, 1) == '>'){
					// szukamy poczatku taga
					for($i=($pos-2); $i >= 0; $i--){
						if(substr($str, $i, 1) == '<'){
							if(strtolower(substr($str, $i+1, 1)) == 'a'){
								$ok = false;

							}
							break;
						}
					}
				}
				elseif(substr($str, $pos-1, 1) == '"')
					$ok = false;
				elseif(substr($str, $pos-2, 2) == '//')
					$ok = false;

				if($ok){
					$positions[] = $pos;
				}
			}

		}

		// zwracamy pierwsza pozycje (najpierw sortujemy)
		if(count($positions) > 0){
			if(count($positions) > 1)
				asort($positions);
			foreach ($positions as $p)
				return $p;
		}

		else
			return false;
	}

	/**
	 * Funkcja zwraca pozycje konca linka o podanej pozycji poczatkowej.
	 *
	 * @param str $str
	 * @param int $start
	 *
	 * @return int
	 */
	function find_end_of_url($str, $start){
		$limiters = array(' ','<','&nbsp');
		// szukamy pierwszego delimitera
		for($i = $start; $i < strlen($str); $i++){
			if(in_array(substr($str, $i, 1), $limiters))
				return $i;
		}

		return (strlen($str) - 1);
	}
	/**
	 * Funkcja konwertujaca URL-e znalezione w podanym ciagu na hiperlinki.
	 * Drugi parametr okresla maksymalna dlugosc opisu linku.
	 *
	 * @param str $str
	 * @param int $maxlength
	 *
	 * @return str
	 */
	function convert_urls($str, $maxlength){
		$prot = array('http://','ftp://','https://','www.');
		$off = 0;
		$pos = false;
		$out_str = $str;
		do{
			if($pos !== false){
				if(substr($out_str, ($pos-1), 1) != '"'){
					$end = find_end_of_url($out_str, $pos);
					if($end > $pos){
						$link   = substr($out_str, $pos, ($end-$pos));
						if(strlen($link) > 6 && strpos($link, '.') !== false){
							$search = $link;
							if(substr($link, 0, 4) == 'www.')
								$link = 'http://'.$link;

							$hlink = '<a href="'.trim($link).'">'.substr(trim(str_replace($prot, '', $link)), 0, $maxlength).'</a>';
							$out_str = str_replace($search, $hlink, $out_str);
							$off   = $pos + strlen($hlink);
						}
						else
							$off = $pos + strlen($link);
					}
					else
						$off = $pos + 10;
				}
				else
					$off = $pos + 9;

			}
			$pos = find_start_of_url($out_str, $off);
		} while($pos !== false);

		return $out_str;
	}
?>